package demo2

import "fmt"

// 选项设计模式  思路，根据不同的传参都能处理不同的结果

// 参数设计 --->所有的参数可以在这里拓展
type Options struct {
	StrOption1 string
	StrOption2 string
	StrOption3 string
	IntOption1 int
	IntOption2 int
	IntOption3 int
}

// 定义接口
type OptionInterface interface {
	OptionsInit(...OptionFunc) *Options
}

// 定义函数类型
type OptionFunc func(*Options)

// 定义函数参数
func WithStrOption1(opt string) OptionFunc {
	return func(o *Options) {
		o.StrOption1 = opt
	}
}

// 定义函数参数
func WithStrOption2(opt string) OptionFunc {
	return func(o *Options) {
		o.StrOption2 = opt
	}
}

// 定义函数参数
func WithStrOption3(opt string) OptionFunc {
	return func(o *Options) {
		o.StrOption3 = opt
	}
}

// 定义函数参数
func WithIntOption1(opt int) OptionFunc {
	return func(o *Options) {
		o.IntOption1 = opt
	}
}

// 定义函数参数
func WithIntOption2(opt int) OptionFunc {
	return func(o *Options) {
		o.IntOption1 = opt
	}
}

// 定义函数参数
func WithIntOption3(opt int) OptionFunc {
	return func(o *Options) {
		o.IntOption1 = opt
	}
}

//  方法实现
func OptionsInit(opts ...OptionFunc) *Options {
	var o Options
	for _, opt := range opts {
		opt(&o)
	}
	fmt.Println(o)
	return &o
}
